package moodle.Agentes.actions.Companheiro;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import dao.GerenciaCurso;
import dao.MoodleDAO;
import moodle.Org.MoodleEnv;
import moodle.dados.Aluno;
import moodle.dados.Atividade;
import moodle.dados.Curso;
import moodle.dados.atividades.AtividadeNota;
import moodle.dados.atividades.AtividadeParticipacao;
import moodle.dados.mensagem.Mensagem;
import jamder.Environment;
import jamder.behavioural.Action;
import jamder.behavioural.Condition;

public class InformarAndamento extends Action {

	private boolean done = false;
	private boolean mantemAtivo;
	List<Atividade> alunoSemNota;
	
	public InformarAndamento(String name){
		super(name);
	}
	
	public InformarAndamento(String name, Condition pre_condition,
			Condition pos_condition) {
		super(name, pre_condition, pos_condition);
		
	}
	
	@Override
	public void execute(Environment env, Object[] params) {
		
		block(6*1000L);
		
		
		mantemAtivo = ((MoodleEnv)env).getMantemAgentesAtivos();
		
		if(!mantemAtivo)
			return;
	
		
		GerenciaCurso manager = ((MoodleEnv)env).getGerenciaCurso();
		
		BigInteger useridfrom = new BigInteger("2");
		
		boolean podeEnviar = false;
		
		List<Atividade> atividadesAlunoSemNota = new ArrayList<Atividade>();
		
		for(Curso curso : manager.getCursos()){
			
			
			
			for(Aluno aluno : curso.getAlunos()){
			
				podeEnviar = false;
				
				atividadesAlunoSemNota.clear();
				
				BigInteger useridto = aluno.getId();
				
				String smallmessage = "Prezado " + aluno.getCompleteName() + ", \n";
				smallmessage += "Na disciplina " + curso.getFullName() + " , seu atual andamento é: \n\n";
				
				
				for(AtividadeNota at : curso.getAtividadesNota()){
					
					if(at.getAlunosComNotas().containsKey(aluno)){
					
						podeEnviar = true;
						smallmessage += "Atividade " + at.getName() + ": \n";
						smallmessage += "Sua nota: " + at.getAlunosComNotas().get(aluno) + " / Nota máxima: " + at.getNotaMaxima() + "\n\n";
					
					}else{
						//verificar se nao passou a data final de postagem da atividade
						atividadesAlunoSemNota.add(at);
					}		
					
					 
				}
				
				for(AtividadeParticipacao at : curso.getAtividadesParticipacao()){
					
					if(at.isAvaliativo()){
						
						if(at.getAlunosComNotas().containsKey(aluno)){
							
							podeEnviar = true;
							smallmessage += "Atividade " + at.getName() + ": \n";
							smallmessage += "Sua nota: " + at.getAlunosComNotas().get(aluno) + " / Nota máxima: " + at.getNotaMaxima() + "\n\n";
						
						}else{
							//mesma obs acima
							atividadesAlunoSemNota.add(at);
						}
						
					}
				}
				
				if(!atividadesAlunoSemNota.isEmpty()){
				
					smallmessage += "\nAinda faltam notas suas nas seguintes atividades:\n";
					
					for(Atividade at : atividadesAlunoSemNota){
						
						smallmessage +=" - " + at.getName() + "\n";
					}

				}
								
				
				if(podeEnviar){
				
					try{
					
						Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and itemtype = 'course' ");
						query.setParameter(1, curso.getId());
						
						BigInteger itemIdCurso = (BigInteger) query.getSingleResult();
						
						Query query2 = MoodleDAO.findNativeQueryParameterized("SELECT finalgrade FROM mdl_grade_grades WHERE itemid = ?1 and userid = ?2");
						query2.setParameter(1, itemIdCurso);
						query2.setParameter(2, aluno.getId());
						
						
						BigDecimal nota = (BigDecimal)query2.getSingleResult();
						
						smallmessage += "\n Sua nota final atual no curso é: " + nota.toString();
				
					}catch(NoResultException e){
						
						smallmessage += "\n Sem nota final ainda no curso.";
						
					}
					
					/* Enviar um comentario informando ao aluno sobre a nota final.
					 * Caso nota final < 7, entao incentiva-lo, pelo contrario, parabeniza-lo
					 */
					
					smallmessage += "\n"; 	
					String fullmessage = smallmessage;
					
					fullmessage += "\n--------------------------------------------------------------------- \nEste e-mail é a cópia de uma mensagem que foi enviada para você em \"GESMA\". Clique http://127.0.1.1/moodle/message/index.php?user=" + useridto + "&id= " + useridfrom +" para responder. ";
					
					Long time = System.currentTimeMillis();
					
					Mensagem msg = new Mensagem();
					msg.setSubject("Nova mensagem do Administrador");
					msg.setUseridfrom(useridfrom);
					msg.setUseridto(useridto);
					msg.setSmallmessage(smallmessage);
					msg.setFullmessage(fullmessage);
					msg.setTimecreated(time);
					
					((MoodleEnv)env).addMensagem(msg);
					
				}
				
				
			}
	
		}
		
		
	}
	
	@Override
	public boolean done() {
		return done;
	}

}
